1 Introduction

Every year, the New York State Forest Rangers have to rescue people who use the outdoors for recreation. Some get injured and need evacuation, some get lost and need search and rescue, but all put a burden on our park services resources. Any efforts to educate people on how to be safer and more responsible in nature will go a long way towards helping alleviate this burden but the Department of Environmental Conservation does not have the resources to market to everyone. In our analysis, we will try to identify groups that are at a greater risk of needing evacuation so we can make a recommendation on where best to allocate resources on awareness. We decided to focus on the Adirondack Park because of the region’s high traffic and ability to attract inexperienced visitors. &&&&The variables of interest are the amount of rangers involved, amount of people being rescued, age and gender of rescued, and the type of activity that caused the accident. We will be analyzing the rescues happening in the Adirondack Park to try to find groups of people who are at a greater risk of needing rescue and would therefore benefit more from targeted awareness campaigns.

2 Background

This is observational data originally found on Data World (https://data.world/) from the NYSDEC on forest ranger incident reports. In order to help understand the data it would be helpful for the reader to have previous knowledge about recreational activities in New York State forests and the risks involved with those activities.

3 Methods and Results

To help us visualize the location found data we can look at all the incidents plotted on a map of New York State as shown in section 3.1. From visual inspection, we can see the highest density of rescues occur in the Adirondacks. We can verify this by using the table function to summarize the results.


Outside ADK  Inside ADK 
       1156        2078 

3.1 Location Found of all Incidents

tmap mode set to interactive viewing

One of the variables we focused the most on was the age of the rescued. Section 3.2 displays the location found data again by subject age except this time just for incidents that started in the Adirondack park. There are a few outliers where people were found outside the park. These are likely due to the person being reported missing but then being found at home.

3.2 Location Found in Adirondacks Grouped by Age

tmap mode set to interactive viewing

The data frame can be overwhelming to look at. It is easier to digest when summarized with the “table” function. We can use this function to better visualize the variables of interest.

Some initial observations are that more men need assistance than women, there were more searches than rescues, recoveries, or fugitive searches combined, and the most common activity to need assistance was hiking, followed not so closely by boating.


        F    M 
   6  827 1245 

Fugitive Search        Recovery          Rescue          Search 
              2              60             902            1114 

            Aircraft               Biking              Boating              Camping             Chainsaw    Climbing:Rock/Ice 
                   8                   12                  133                   60                    3                   35 
            Criminal           Despondent              Fishing         Flood Victim               Hiking     Horseback riding 
                   4                   20                   18                    1                 1512                    2 
             Hunting        Motor vehicle Off road vehicle/ATV              Runaway               Skiing           Snowmobile 
                  74                    6                   16                   17                   23                   63 
            Stranded             Swimming              Walking           Whitewater 
                   3                   26                   40                    2 

Our initial endeavor was to see if there was a correlation between subject age and type of response. From our analysis we concluded that there was no such correlation. The box plot is a helpful visualization because

There seems to be a relationship between the subject’s age and what type of response. It can be concluded that as people get older, they may become more familiar with the land, or simply be more careful with their activities. Search and Rescue responses are the only type that occur for people 30 and under, proving that the younger people should probably have more training on certain skills before traveling into the mountains alone. Although, the mean is around 35 to 40 years old, meaning that mostly people over 30 are more common in general in the area, and therefore needing the help just as much. Overall all people traversing into the mountains should have better safety awareness before going out alone, in case any problems occur.

Another important point to make about this data is the noticeable relation between older people and recovery. As we all know, as we age our bodies are not as capable as they used to be, meaning they are more likely to be injured, causing a need to be rescued. One way to decrease the need for rescues could be extra training about safety precautions and give fair warnings about certain activities. For example if a hike has one area that gets slippery before the rest, put up more signs or make sure it is mentioned before anyone even begins the excursion.

Warning: Removed 70 rows containing non-finite values (stat_boxplot).

Mean ages
Recovery=  50.8
Rescue=  39.83433
Search=  35.26649

Just ADK

Another variable that was considered was the time range to close the incident case. The mean time per incident type was calculated, giving an average of how long each one took to complete. Surprisingly, rescue took more time overall than search or recovery. This is most likely because the case itself is longer in general. For search, when they find the person, the case is closed. But, when a rescue is required, they need more time to relieve the person from the situation, and get them to safety. A way to decrease this time could be to change how they decide search, rescue and recovery. If search was simply finding the person, rescue is bringing them out, and recovery is their time in the hospital, then many more of these situations can be applied to each incident.

[1] 1778.368
Mean incident time elapsed
Recovery=  1518.026
Rescue=  2111.401
Search=  1006.627

Perform at least one relevant hypothesis test.

The first hypothesis test was a two-tailed test to find the difference between between amount of males and females.


    Welch Two Sample t-test

data:  female$subject_age and male$subject_age
t = -3.176, df = 1828.6, p-value = 0.001518
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -4.301948 -1.017200
sample estimates:
mean of x mean of y 
 36.05625  38.71582 

The second hypothesis test performed was a single-tailed hypothesis to see if the ages between rescued males and females differ.
The null hypothesis is mu_f - mu_m = 0 The alternative hypothesis is mu_f - mu_m < 0 The t-test is performed to find the difference between the two samples. After the t-test is run, the value is -3.176, meaning we reject the null hypothesis because the difference between males and females is not 0.


    Welch Two Sample t-test

data:  female$subject_age and male$subject_age
t = -3.176, df = 1828.6, p-value = 0.0007591
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
      -Inf -1.281465
sample estimates:
mean of x mean of y 
 36.05625  38.71582 

Since two variable relations were considered, another set of t-tests were performed. A two sided t-test where mu =


    Welch Two Sample t-test

data:  search$incident_time_elapsed and rescue$incident_time_elapsed
t = -0.86738, df = 1016.5, p-value = 0.3859
alternative hypothesis: true difference in means is not equal to 0
98 percent confidence interval:
 -2187.351  1000.602
sample estimates:
mean of x mean of y 
 1518.026  2111.401 


    Welch Two Sample t-test

data:  recovery$incident_time_elapsed and search$incident_time_elapsed
t = -1.4097, df = 268.19, p-value = 0.1598
alternative hypothesis: true difference in means is not equal to 0
98 percent confidence interval:
 -1360.3852   337.5885
sample estimates:
mean of x mean of y 
 1006.627  1518.026 

Call:
lm(formula = incident_time_elapsed ~ number_of_rangers_involved, 
    data = y)

Coefficients:
               (Intercept)  number_of_rangers_involved  
                    1084.2                       213.5  
[1] 286377238575

Call:
lm(formula = incident_time_elapsed ~ number_of_rangers_involved, 
    data = y)

Residuals:
   Min     1Q Median     3Q    Max 
 -5770  -1468  -1241  -1043 367940 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 1084.19     365.63   2.965 0.003064 ** 
number_of_rangers_involved   213.47      64.73   3.298 0.000993 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12650 on 1789 degrees of freedom
Multiple R-squared:  0.006042,  Adjusted R-squared:  0.005487 
F-statistic: 10.88 on 1 and 1789 DF,  p-value: 0.0009934

Check the various assumptions of for statistical tests.


Call:
lm(formula = number_of_rangers_involved ~ subject_age, data = raw_adk_data)

Residuals:
   Min     1Q Median     3Q    Max 
-2.536 -2.207 -1.240  0.590 80.700 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.142535   0.219316  14.329   <2e-16 ***
subject_age 0.004627   0.005212   0.888    0.375    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.39 on 2006 degrees of freedom
  (70 observations deleted due to missingness)
Multiple R-squared:  0.0003927, Adjusted R-squared:  -0.0001056 
F-statistic: 0.7882 on 1 and 2006 DF,  p-value: 0.3748


# predict the time to close a case with 3 rangers
predict(incident_model, newdata = data.frame(number_of_rangers_involved = 3))
       1 
1724.612 
# correlation between time elapsed and number of rangers for all types of incidents
y %>%
  ggplot(aes(x = incident_time_elapsed, y = number_of_rangers_involved, color = response_type)) +
  geom_point(size = 0.1) +
  facet_wrap(vars(response_type))


# looking at correlation for each response type
# there is a high correlation between time elapsed and number of rangers involved for fugitive search
# the other ones dont show a high correlation but this is kinda expected because there are lots of outliers
y %>%
  group_by(response_type) %>%
  summarize(r = cor(incident_time_elapsed, number_of_rangers_involved, use = "complete.obs"))
Warning in cor(incident_time_elapsed, number_of_rangers_involved, use = "complete.obs") :
  the standard deviation is zero
# incident model qq plot
plot(incident_model)

NA

For the linear regression analysis, interpret coefficients and/or make relevant predictions and summarize their meaning.

Warning: Removed 70 rows containing missing values (geom_point).

[1] 0.01981789

Call:
lm(formula = number_of_rangers_involved ~ subject_age, data = raw_adk_data)

Residuals:
   Min     1Q Median     3Q    Max 
-2.536 -2.207 -1.240  0.590 80.700 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.142535   0.219316  14.329   <2e-16 ***
subject_age 0.004627   0.005212   0.888    0.375    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.39 on 2006 degrees of freedom
  (70 observations deleted due to missingness)
Multiple R-squared:  0.0003927, Adjusted R-squared:  -0.0001056 
F-statistic: 0.7882 on 1 and 2006 DF,  p-value: 0.3748

raw_adk_data %>%
  group_by(response_type) %>%
  summarize(r = cor(x = subject_age, y = number_of_rangers_involved, use = "complete.obs"))
Warning in cor(x = subject_age, y = number_of_rangers_involved, use = "complete.obs") :
  the standard deviation is zero
cor(raw_adk_data$subject_age,raw_adk_data$number_of_rangers_involved, use = "complete.obs")
[1] 0.01981789

4 Conclusions

We were unable to find a demographic to target with an awareness campaign because of low statistical significance. From a common sense standpoint it would make sense to market more to hikers because they make up the vast majority of those in need of assistance but since we do not have data on how many people participate in each activity, we cannot definitively say that hikers need assistance at a higher rate than those in other activities. We could extend this study to the rest of New York State and even the rest of the United States, but not all regions are comparable due to differences in usage and common activities. What works in one area might not work elsewhere. One thing that would improve this study is more data and general usage data to compare rates of needed rescue in different demographics. The data on rescues during Covid would be especially interesting to look at since more people engaged with the outdoors. Specifically more inexperienced people. It would also be informative to have another variable in the study that qualitatively rates victim’s level of competence. …

References

Data.world https://data.world/data-ny-gov/u6hu-h7p5

LS0tDQp0aXRsZTogIlNlYXJjaCBhbmQgUmVzY3VlcyBpbiB0aGUgQWRpcm9uZGFja3MiDQphdXRob3I6ICJLcmlzdGluYSBGcmFua2xpbiwgUm9zaWUgRGVsd2ljaGUsIENvbm5vciBIYXRoYXdheSwgSmFja2llIEJ1ZGthIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQotLS0NCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRXZlcnkgeWVhciwgdGhlIE5ldyBZb3JrIFN0YXRlIEZvcmVzdCBSYW5nZXJzIGhhdmUgdG8gcmVzY3VlIHBlb3BsZSB3aG8gdXNlIHRoZSBvdXRkb29ycyBmb3IgcmVjcmVhdGlvbi4gU29tZSBnZXQgaW5qdXJlZCBhbmQgbmVlZCBldmFjdWF0aW9uLCBzb21lIGdldCBsb3N0IGFuZCBuZWVkIHNlYXJjaCBhbmQgcmVzY3VlLCBidXQgYWxsIHB1dCBhIGJ1cmRlbiBvbiBvdXIgcGFyayBzZXJ2aWNlcyByZXNvdXJjZXMuIEFueSBlZmZvcnRzIHRvIGVkdWNhdGUgcGVvcGxlIG9uIGhvdyB0byBiZSBzYWZlciBhbmQgbW9yZSByZXNwb25zaWJsZSBpbiBuYXR1cmUgd2lsbCBnbyBhIGxvbmcgd2F5IHRvd2FyZHMgaGVscGluZyBhbGxldmlhdGUgdGhpcyBidXJkZW4gYnV0IHRoZSBEZXBhcnRtZW50IG9mIEVudmlyb25tZW50YWwgQ29uc2VydmF0aW9uIGRvZXMgbm90IGhhdmUgdGhlIHJlc291cmNlcyB0byBtYXJrZXQgdG8gZXZlcnlvbmUuIEluIG91ciBhbmFseXNpcywgd2Ugd2lsbCB0cnkgdG8gaWRlbnRpZnkgZ3JvdXBzIHRoYXQgYXJlIGF0IGEgZ3JlYXRlciByaXNrIG9mIG5lZWRpbmcgZXZhY3VhdGlvbiBzbyB3ZSBjYW4gbWFrZSBhIHJlY29tbWVuZGF0aW9uIG9uIHdoZXJlIGJlc3QgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIG9uIGF3YXJlbmVzcy4gV2UgZGVjaWRlZCB0byBmb2N1cyBvbiB0aGUgQWRpcm9uZGFjayBQYXJrIGJlY2F1c2Ugb2YgdGhlIHJlZ2lvbidzIGhpZ2ggdHJhZmZpYyBhbmQgYWJpbGl0eSB0byBhdHRyYWN0IGluZXhwZXJpZW5jZWQgdmlzaXRvcnMuICYmJiZUaGUgdmFyaWFibGVzIG9mIGludGVyZXN0IGFyZSB0aGUgYW1vdW50IG9mIHJhbmdlcnMgaW52b2x2ZWQsIGFtb3VudCBvZiBwZW9wbGUgYmVpbmcgcmVzY3VlZCwgYWdlIGFuZCBnZW5kZXIgb2YgcmVzY3VlZCwgYW5kIHRoZSB0eXBlIG9mIGFjdGl2aXR5IHRoYXQgY2F1c2VkIHRoZSBhY2NpZGVudC4gV2Ugd2lsbCBiZSBhbmFseXppbmcgdGhlIHJlc2N1ZXMgaGFwcGVuaW5nIGluIHRoZSBBZGlyb25kYWNrIFBhcmsgdG8gdHJ5IHRvIGZpbmQgZ3JvdXBzIG9mIHBlb3BsZSB3aG8gYXJlIGF0IGEgZ3JlYXRlciByaXNrIG9mIG5lZWRpbmcgcmVzY3VlIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVuZWZpdCBtb3JlIGZyb20gdGFyZ2V0ZWQgYXdhcmVuZXNzIGNhbXBhaWducy4NCg0KLi4uDQoNCiMgQmFja2dyb3VuZA0KDQpUaGlzIGlzIG9ic2VydmF0aW9uYWwgZGF0YSBvcmlnaW5hbGx5IGZvdW5kIG9uIERhdGEgV29ybGQgKGh0dHBzOi8vZGF0YS53b3JsZC8pIGZyb20gdGhlIE5ZU0RFQyBvbiBmb3Jlc3QgcmFuZ2VyIGluY2lkZW50IHJlcG9ydHMuIEluIG9yZGVyIHRvIGhlbHAgdW5kZXJzdGFuZCB0aGUgZGF0YSBpdCB3b3VsZCBiZSBoZWxwZnVsIGZvciB0aGUgcmVhZGVyIHRvIGhhdmUgcHJldmlvdXMga25vd2xlZGdlIGFib3V0IHJlY3JlYXRpb25hbCBhY3Rpdml0aWVzIGluIE5ldyBZb3JrIFN0YXRlIGZvcmVzdHMgYW5kIHRoZSByaXNrcyBpbnZvbHZlZCB3aXRoIHRob3NlIGFjdGl2aXRpZXMuIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHRpZHltb2RlbHMpDQpsaWJyYXJ5KGh0dHIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkgKHJlYWRyKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp1cmxmaWxlPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFCdWRrYS9TVEFUMzgzX0YyMS9Qcm9qZWN0L3VwZGF0ZS5jc3YiDQpyYXdfc3JfZGF0YTwtcmVhZC5jc3YodXJsKHVybGZpbGUpKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KcmF3X2Fka19kYXRhIDwtIHJhd19zcl9kYXRhICU+JQ0KICBmaWx0ZXIoaW5jaWRlbnRfYWRpcm9uZGFja19wYXJrID09ICJUUlVFIikNCmBgYA0KLi4uDQoNCiMgTWV0aG9kcyBhbmQgUmVzdWx0cw0KDQpUbyBoZWxwIHVzIHZpc3VhbGl6ZSB0aGUgbG9jYXRpb24gZm91bmQgZGF0YSB3ZSBjYW4gbG9vayBhdCBhbGwgdGhlIGluY2lkZW50cyBwbG90dGVkIG9uIGEgbWFwIG9mIE5ldyBZb3JrIFN0YXRlIGFzIHNob3duIGluIHNlY3Rpb24gMy4xLiBGcm9tIHZpc3VhbCBpbnNwZWN0aW9uLCB3ZSBjYW4gc2VlIHRoZSBoaWdoZXN0IGRlbnNpdHkgb2YgcmVzY3VlcyBvY2N1ciBpbiB0aGUgQWRpcm9uZGFja3MuIFdlIGNhbiB2ZXJpZnkgdGhpcyBieSB1c2luZyB0aGUgdGFibGUgZnVuY3Rpb24gdG8gc3VtbWFyaXplIHRoZSByZXN1bHRzLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KY291bnRfYWRrIDwtICB0YWJsZShyYXdfc3JfZGF0YVsnaW5jaWRlbnRfYWRpcm9uZGFja19wYXJrJ10pDQogIHJvd25hbWVzKGNvdW50X2FkaykgPSBjKCJPdXRzaWRlIEFESyIsICJJbnNpZGUgQURLIikNCmNvdW50X2Fkaw0KYGBgDQoNCiMjIExvY2F0aW9uIEZvdW5kIG9mIGFsbCBJbmNpZGVudHMNCmBgYHtyICBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmF3X3NyX21hcCA8LSByYXdfc3JfZGF0YVtjb21wbGV0ZS5jYXNlcyhyYXdfc3JfZGF0YSksIF0gJT4lDQpzdF9hc19zZihjb29yZHMgPSBjKCJsb2NhdGlvbl9mb3VuZF9sb25naXR1ZGUiLCAibG9jYXRpb25fZm91bmRfbGF0aXR1ZGUiKSwgY3JzID0gNDMyNikNCnRtYXBfbW9kZSgidmlldyIpDQp0bV9zaGFwZShyYXdfc3JfbWFwKSArDQogIHRtX2RvdHMoc2l6ZT0wLjAyLGNvbD0icmVkIiwgYWxwaGEgPSAwLjUpICsgdG1fbGVnZW5kKG91dHNpZGUgPSBUUlVFKSANCmBgYA0KDQouLi4NCg0KT25lIG9mIHRoZSB2YXJpYWJsZXMgd2UgZm9jdXNlZCB0aGUgbW9zdCBvbiB3YXMgdGhlIGFnZSBvZiB0aGUgcmVzY3VlZC4gU2VjdGlvbiAzLjIgZGlzcGxheXMgdGhlIGxvY2F0aW9uIGZvdW5kIGRhdGEgYWdhaW4gYnkgc3ViamVjdCBhZ2UgZXhjZXB0IHRoaXMgdGltZSBqdXN0IGZvciBpbmNpZGVudHMgdGhhdCBzdGFydGVkIGluIHRoZSBBZGlyb25kYWNrIHBhcmsuIFRoZXJlIGFyZSBhIGZldyBvdXRsaWVycyB3aGVyZSBwZW9wbGUgd2VyZSBmb3VuZCBvdXRzaWRlIHRoZSBwYXJrLiBUaGVzZSBhcmUgbGlrZWx5IGR1ZSB0byB0aGUgcGVyc29uIGJlaW5nIHJlcG9ydGVkIG1pc3NpbmcgYnV0IHRoZW4gYmVpbmcgZm91bmQgYXQgaG9tZS4gDQoNCiMjIExvY2F0aW9uIEZvdW5kIGluIEFkaXJvbmRhY2tzIEdyb3VwZWQgYnkgQWdlDQpgYGB7ciAgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFka19nZW9tX2RhdGEgPC0gcmF3X2Fka19kYXRhW2NvbXBsZXRlLmNhc2VzKHJhd19hZGtfZGF0YSksIF0gJT4lDQpzdF9hc19zZihjb29yZHMgPSBjKCJsb2NhdGlvbl9mb3VuZF9sb25naXR1ZGUiLCAibG9jYXRpb25fZm91bmRfbGF0aXR1ZGUiKSwgY3JzID0gNDMyNikgDQp0bWFwX21vZGUoInZpZXciKQ0KdG1fc2hhcGUoYWRrX2dlb21fZGF0YSkgKw0KICB0bV9kb3RzKHNpemU9MC4wMixjb2w9InN1YmplY3RfYWdlIiwgYWxwaGEgPSAwLjcsIHBhbGV0dGUgPSAiU3BlY3RyYWwiKQ0KYGBgDQoNClRoZSBkYXRhIGZyYW1lIGNhbiBiZSBvdmVyd2hlbG1pbmcgdG8gbG9vayBhdC4gSXQgaXMgZWFzaWVyIHRvIGRpZ2VzdCB3aGVuIHN1bW1hcml6ZWQgd2l0aCB0aGUgInRhYmxlIiBmdW5jdGlvbi4gV2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJldHRlciB2aXN1YWxpemUgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdC4gDQoNClNvbWUgaW5pdGlhbCBvYnNlcnZhdGlvbnMgYXJlIHRoYXQgbW9yZSBtZW4gbmVlZCBhc3Npc3RhbmNlIHRoYW4gd29tZW4sIHRoZXJlIHdlcmUgbW9yZSBzZWFyY2hlcyB0aGFuIHJlc2N1ZXMsIHJlY292ZXJpZXMsIG9yIGZ1Z2l0aXZlIHNlYXJjaGVzIGNvbWJpbmVkLCBhbmQgdGhlIG1vc3QgY29tbW9uIGFjdGl2aXR5IHRvIG5lZWQgYXNzaXN0YW5jZSB3YXMgaGlraW5nLCBmb2xsb3dlZCBub3Qgc28gY2xvc2VseSBieSBib2F0aW5nLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KY291bnRfZ2VuZGVyIDwtICB0YWJsZShyYXdfYWRrX2RhdGFbJ3N1YmplY3RfZ2VuZGVyJ10pDQpjb3VudF9nZW5kZXINCmNvdW50X3J0eXBlIDwtIHRhYmxlKHJhd19hZGtfZGF0YVsncmVzcG9uc2VfdHlwZSddKQ0KY291bnRfcnR5cGUNCmNvdW50X2FjdGl2aXR5IDwtIHRhYmxlKHJhd19hZGtfZGF0YVsnYWN0aXZpdHknXSkNCmNvdW50X2FjdGl2aXR5DQoNCmBgYA0KDQpPdXIgaW5pdGlhbCBlbmRlYXZvciB3YXMgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNvcnJlbGF0aW9uIGJldHdlZW4gc3ViamVjdCBhZ2UgYW5kIHR5cGUgb2YgcmVzcG9uc2UuIEZyb20gb3VyIGFuYWx5c2lzIHdlIGNvbmNsdWRlZCB0aGF0IHRoZXJlIHdhcyBubyBzdWNoIGNvcnJlbGF0aW9uLiBUaGUgYm94IHBsb3QgaXMgYSBoZWxwZnVsIHZpc3VhbGl6YXRpb24gYmVjYXVzZSANCg0KVGhlcmUgc2VlbXMgdG8gYmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgc3ViamVjdCdzIGFnZSBhbmQgd2hhdCB0eXBlIG9mIHJlc3BvbnNlLiAgSXQgY2FuIGJlIGNvbmNsdWRlZCB0aGF0IGFzIHBlb3BsZSBnZXQgb2xkZXIsIHRoZXkgbWF5IGJlY29tZSBtb3JlIGZhbWlsaWFyIHdpdGggdGhlIGxhbmQsIG9yIHNpbXBseSBiZSBtb3JlIGNhcmVmdWwgd2l0aCB0aGVpciBhY3Rpdml0aWVzLiAgU2VhcmNoIGFuZCBSZXNjdWUgcmVzcG9uc2VzIGFyZSB0aGUgb25seSB0eXBlIHRoYXQgb2NjdXIgZm9yIHBlb3BsZSAzMCBhbmQgdW5kZXIsIHByb3ZpbmcgdGhhdCB0aGUgeW91bmdlciBwZW9wbGUgc2hvdWxkIHByb2JhYmx5IGhhdmUgbW9yZSB0cmFpbmluZyBvbiBjZXJ0YWluIHNraWxscyBiZWZvcmUgdHJhdmVsaW5nIGludG8gdGhlIG1vdW50YWlucyBhbG9uZS4gIEFsdGhvdWdoLCB0aGUgbWVhbiBpcyBhcm91bmQgMzUgdG8gNDAgeWVhcnMgb2xkLCBtZWFuaW5nIHRoYXQgbW9zdGx5IHBlb3BsZSBvdmVyIDMwIGFyZSBtb3JlIGNvbW1vbiBpbiBnZW5lcmFsIGluIHRoZSBhcmVhLCBhbmQgdGhlcmVmb3JlIG5lZWRpbmcgdGhlIGhlbHAganVzdCBhcyBtdWNoLiAgT3ZlcmFsbCBhbGwgcGVvcGxlIHRyYXZlcnNpbmcgaW50byB0aGUgbW91bnRhaW5zIHNob3VsZCBoYXZlIGJldHRlciBzYWZldHkgYXdhcmVuZXNzIGJlZm9yZSBnb2luZyBvdXQgYWxvbmUsIGluIGNhc2UgYW55IHByb2JsZW1zIG9jY3VyLg0KDQpBbm90aGVyIGltcG9ydGFudCBwb2ludCB0byBtYWtlIGFib3V0IHRoaXMgZGF0YSBpcyB0aGUgbm90aWNlYWJsZSByZWxhdGlvbiBiZXR3ZWVuIG9sZGVyIHBlb3BsZSBhbmQgcmVjb3ZlcnkuICBBcyB3ZSBhbGwga25vdywgYXMgd2UgYWdlIG91ciBib2RpZXMgYXJlIG5vdCBhcyBjYXBhYmxlIGFzIHRoZXkgdXNlZCB0byBiZSwgbWVhbmluZyB0aGV5IGFyZSBtb3JlIGxpa2VseSB0byBiZSBpbmp1cmVkLCBjYXVzaW5nIGEgbmVlZCB0byBiZSByZXNjdWVkLiAgT25lIHdheSB0byBkZWNyZWFzZSB0aGUgbmVlZCBmb3IgcmVzY3VlcyBjb3VsZCBiZSBleHRyYSB0cmFpbmluZyBhYm91dCBzYWZldHkgcHJlY2F1dGlvbnMgYW5kIGdpdmUgZmFpciB3YXJuaW5ncyBhYm91dCBjZXJ0YWluIGFjdGl2aXRpZXMuICBGb3IgZXhhbXBsZSBpZiBhIGhpa2UgaGFzIG9uZSBhcmVhIHRoYXQgZ2V0cyBzbGlwcGVyeSBiZWZvcmUgdGhlIHJlc3QsIHB1dCB1cCBtb3JlIHNpZ25zIG9yIG1ha2Ugc3VyZSBpdCBpcyBtZW50aW9uZWQgYmVmb3JlIGFueW9uZSBldmVuIGJlZ2lucyB0aGUgZXhjdXJzaW9uLg0KYGBge3IgZWNobz1GQUxTRX0NCnJhd19hZGtfZGF0YSAlPiUgDQogIGdncGxvdChhZXMoeSA9IHN1YmplY3RfYWdlLCB4ID0gcmVzcG9uc2VfdHlwZSkpICsNCiAgZ2VvbV9ib3hwbG90KCkrDQogIGdndGl0bGUoIlN1YmplY3QgQWdlIHZzIFJlc3BvbnNlIFR5cGUiKSANCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpzZWFyY2hfZGF0YSA8LSByYXdfYWRrX2RhdGEgJT4lDQogIGZpbHRlcihyZXNwb25zZV90eXBlPT0iU2VhcmNoIikNCnJlc2N1ZV9kYXRhIDwtIHJhd19hZGtfZGF0YSAlPiUNCiAgZmlsdGVyKHJlc3BvbnNlX3R5cGU9PSJSZXNjdWUiKQ0KcmVjb3ZlcnlfZGF0YSA8LSByYXdfYWRrX2RhdGEgJT4lDQogIGZpbHRlcihyZXNwb25zZV90eXBlPT0iUmVjb3ZlcnkiKQ0KTUFyZWNvdmVyeSA8LSBtZWFuKHJlY292ZXJ5X2RhdGEkc3ViamVjdF9hZ2UsIG5hLnJtID0gIlRSVUUiKQ0KTUFyZXNjdWUgPC0gbWVhbihyZXNjdWVfZGF0YSRzdWJqZWN0X2FnZSwgbmEucm0gPSAiVFJVRSIpDQpNQXNlYXJjaCA8LSBtZWFuKHNlYXJjaF9kYXRhJHN1YmplY3RfYWdlLCBuYS5ybSA9ICJUUlVFIikNCmNhdCgnTWVhbiBhZ2VzDQpSZWNvdmVyeT0gJyxNQXJlY292ZXJ5KQ0KY2F0KCcNClJlc2N1ZT0gJyxNQXJlc2N1ZSkNCmNhdCgnDQpTZWFyY2g9ICcsTUFzZWFyY2gpDQpgYGANCg0KYGBge3IgTG9hZCBEYXRhLCBpbmNsdWRlPUZBTFNFfQ0KcmF3X3VwZGF0ZSA8LSByZWFkLmNzdigidXBkYXRlLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KSnVzdCBBREsNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQp4cyA8LSByYXdfdXBkYXRlICU+JQ0KICBmaWx0ZXIoaW5jaWRlbnRfYWRpcm9uZGFja19wYXJrID09ICJUUlVFIikNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQp5IDwtIHhzICU+JQ0KICBmaWx0ZXIoaW5jaWRlbnRfdGltZV9lbGFwc2VkPjApDQpgYGANCg0KQW5vdGhlciB2YXJpYWJsZSB0aGF0IHdhcyBjb25zaWRlcmVkIHdhcyB0aGUgdGltZSByYW5nZSB0byBjbG9zZSB0aGUgaW5jaWRlbnQgY2FzZS4gIFRoZSBtZWFuIHRpbWUgcGVyIGluY2lkZW50IHR5cGUgd2FzIGNhbGN1bGF0ZWQsIGdpdmluZyBhbiBhdmVyYWdlIG9mIGhvdyBsb25nIGVhY2ggb25lIHRvb2sgdG8gY29tcGxldGUuICBTdXJwcmlzaW5nbHksIHJlc2N1ZSB0b29rIG1vcmUgdGltZSBvdmVyYWxsIHRoYW4gc2VhcmNoIG9yIHJlY292ZXJ5LiAgVGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlIHRoZSBjYXNlIGl0c2VsZiBpcyBsb25nZXIgaW4gZ2VuZXJhbC4gRm9yIHNlYXJjaCwgd2hlbiB0aGV5IGZpbmQgdGhlIHBlcnNvbiwgdGhlIGNhc2UgaXMgY2xvc2VkLiAgQnV0LCB3aGVuIGEgcmVzY3VlIGlzIHJlcXVpcmVkLCB0aGV5IG5lZWQgbW9yZSB0aW1lIHRvIHJlbGlldmUgdGhlIHBlcnNvbiBmcm9tIHRoZSBzaXR1YXRpb24sIGFuZCBnZXQgdGhlbSB0byBzYWZldHkuDQpBIHdheSB0byBkZWNyZWFzZSB0aGlzIHRpbWUgY291bGQgYmUgdG8gY2hhbmdlIGhvdyB0aGV5IGRlY2lkZSBzZWFyY2gsIHJlc2N1ZSBhbmQgcmVjb3ZlcnkuICBJZiBzZWFyY2ggd2FzIHNpbXBseSBmaW5kaW5nIHRoZSBwZXJzb24sIHJlc2N1ZSBpcyBicmluZ2luZyB0aGVtIG91dCwgYW5kIHJlY292ZXJ5IGlzIHRoZWlyIHRpbWUgaW4gdGhlIGhvc3BpdGFsLCB0aGVuIG1hbnkgbW9yZSBvZiB0aGVzZSBzaXR1YXRpb25zIGNhbiBiZSBhcHBsaWVkIHRvIGVhY2ggaW5jaWRlbnQuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQptZWFuKHkkaW5jaWRlbnRfdGltZV9lbGFwc2VkKQ0KDQpzZWFyY2ggPC0geSAlPiUNCiAgZmlsdGVyKHJlc3BvbnNlX3R5cGU9PSJTZWFyY2giKQ0KcmVzY3VlIDwtIHkgJT4lDQogIGZpbHRlcihyZXNwb25zZV90eXBlPT0iUmVzY3VlIikNCnJlY292ZXJ5IDwtIHkgJT4lDQogIGZpbHRlcihyZXNwb25zZV90eXBlPT0iUmVjb3ZlcnkiKQ0KDQpyZXYgPC0gbWVhbihzZWFyY2gkaW5jaWRlbnRfdGltZV9lbGFwc2VkLCBuYS5ybSA9ICJUUlVFIikNCnJlcyA8LSBtZWFuKHJlc2N1ZSRpbmNpZGVudF90aW1lX2VsYXBzZWQsIG5hLnJtID0gIlRSVUUiKQ0Kc2VhIDwtIG1lYW4ocmVjb3ZlcnkkaW5jaWRlbnRfdGltZV9lbGFwc2VkLCBuYS5ybSA9ICJUUlVFIikNCmNhdCgnTWVhbiBpbmNpZGVudCB0aW1lIGVsYXBzZWQNClJlY292ZXJ5PSAnLHJldikNCmNhdCgnDQpSZXNjdWU9ICcscmVzKQ0KY2F0KCcNClNlYXJjaD0gJyxzZWEpDQpgYGANCg0KDQpQZXJmb3JtIGF0IGxlYXN0IG9uZSByZWxldmFudCBoeXBvdGhlc2lzIHRlc3QuIA0KDQoNCg0KVGhlIGZpcnN0IGh5cG90aGVzaXMgdGVzdCB3YXMgYSB0d28tdGFpbGVkIHRlc3QgdG8gZmluZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJldHdlZW4gYW1vdW50IG9mIG1hbGVzIGFuZCBmZW1hbGVzLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZmVtYWxlIDwtIHJhd19hZGtfZGF0YSAlPiUNCiAgZmlsdGVyKHN1YmplY3RfZ2VuZGVyID09ICJGIikNCg0KbWFsZSA8LSByYXdfYWRrX2RhdGEgJT4lDQogIGZpbHRlcihzdWJqZWN0X2dlbmRlciA9PSAiTSIpDQoNCmgxIDwtIHQudGVzdChmZW1hbGUkc3ViamVjdF9hZ2UsIG1hbGUkc3ViamVjdF9hZ2UsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHZhci5lcXVhbCA9IEZBTFNFKQ0KaDENCmBgYA0KDQpUaGUgc2Vjb25kIGh5cG90aGVzaXMgdGVzdCBwZXJmb3JtZWQgd2FzIGEgc2luZ2xlLXRhaWxlZCBoeXBvdGhlc2lzIHRvIHNlZSBpZiB0aGUgYWdlcyBiZXR3ZWVuIHJlc2N1ZWQgbWFsZXMgYW5kIGZlbWFsZXMgZGlmZmVyLiAgDQpUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIG11X2YgLSBtdV9tID0gMA0KVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaXMgbXVfZiAtIG11X20gPCAwDQpUaGUgdC10ZXN0IGlzIHBlcmZvcm1lZCB0byBmaW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzYW1wbGVzLg0KQWZ0ZXIgdGhlIHQtdGVzdCBpcyBydW4sIHRoZSB2YWx1ZSBpcyAtMy4xNzYsIG1lYW5pbmcgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgYmVjYXVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzIGlzIG5vdCAwLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpmZW1hbGUgPC0gcmF3X2Fka19kYXRhICU+JQ0KICBmaWx0ZXIoc3ViamVjdF9nZW5kZXIgPT0gIkYiKQ0KDQptYWxlIDwtIHJhd19hZGtfZGF0YSAlPiUNCiAgZmlsdGVyKHN1YmplY3RfZ2VuZGVyID09ICJNIikNCg0KaDIgPC0gdC50ZXN0KGZlbWFsZSRzdWJqZWN0X2FnZSwgbWFsZSRzdWJqZWN0X2FnZSwgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIHZhci5lcXVhbCA9IEZBTFNFKQ0KaDINCg0KYGBgDQoNCg0KU2luY2UgdHdvIHZhcmlhYmxlIHJlbGF0aW9ucyB3ZXJlIGNvbnNpZGVyZWQsIGFub3RoZXIgc2V0IG9mIHQtdGVzdHMgd2VyZSBwZXJmb3JtZWQuICBBIHR3byBzaWRlZCB0LXRlc3Qgd2hlcmUgbXUgPSANCmBgYHtyIGVjaG89RkFMU0V9DQojIERvZXMgdGhlIG1lYW4gY2FzZSB0aW1lIGRpZmZlciBiZXR3ZWVuIHNlYXJjaCBhbmQgcmVzY3VlPw0KdC50ZXN0KHNlYXJjaCRpbmNpZGVudF90aW1lX2VsYXBzZWQscmVzY3VlJGluY2lkZW50X3RpbWVfZWxhcHNlZCxhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLGNvbmYubGV2ZWwgPSAuOTgpDQoNCiMgRG9lcyB0aGUgbWVhbiBjYXNlIHRpbWUgZGlmZmVyIGJldHdlZW4gcmVjb3ZlcnkgYW5kIHNlYXJjaD8NCnQudGVzdChyZWNvdmVyeSRpbmNpZGVudF90aW1lX2VsYXBzZWQsc2VhcmNoJGluY2lkZW50X3RpbWVfZWxhcHNlZCxhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLGNvbmYubGV2ZWwgPSAuOTgpDQoNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCmluY2lkZW50X21vZGVsIDwtIGxtKGluY2lkZW50X3RpbWVfZWxhcHNlZH5udW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCwgZGF0YSA9IHkpDQppbmNpZGVudF9tb2RlbA0KIyBpbnRlcmNlcHQgMTIwNi41DQojIHNsb3BlIDYyNC4yIA0KIyB0aGlzIG1lYW5zIHByZWRpY3RlZCB0aW1lID0gNjI0LjIgKiByYW5nZXJzIGludm9sdmVkDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KI3kgJT4lIGdncGxvdChhZXMoeCA9IG51bWJlcl9vZl9yYW5nZXJzX2ludm9sdmVkLCB5ID0gaW5jaWRlbnRfdGltZV9lbGFwc2VkKSkgKw0KIyAgZ2VvbV9wb2ludCgpICsNCiMgIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDMuMjU3ZSswMCwgc2xvcGUgPSA4LjE5NWUtMDYgKQ0KI2luY2lkZW50X21vZGVsJHJlc2lkdWFscw0Kc3VtKGluY2lkZW50X21vZGVsJHJlc2lkdWFsc14yKQ0Kc3VtbWFyeShpbmNpZGVudF9tb2RlbCkNCg0KIyBCZWNhdXNlIHAgaXMgbGVzcyB0aGFuIGFscGhhLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gV2UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSB0aGF0IHRoZXJlIGlzIGEgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGluY2lkZW50IHRpbWUgZWxhcHNlZCBhbmQgbnVtYmVyIG9mIHJhbmdlcnMgaW52b2x2ZWQNCmBgYA0KDQoNCg0KQ2hlY2sgdGhlIHZhcmlvdXMgYXNzdW1wdGlvbnMgb2YgZm9yIHN0YXRpc3RpY2FsIHRlc3RzLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbW9kZWwgPSBsbShudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCB+IHN1YmplY3RfYWdlLCBkYXRhID0gcmF3X2Fka19kYXRhKQ0Kc3VtbWFyeShtb2RlbCkNCnBsb3QobW9kZWwpDQpgYGANCg0KYGBge3J9DQoNCiMgcHJlZGljdCB0aGUgdGltZSB0byBjbG9zZSBhIGNhc2Ugd2l0aCAzIHJhbmdlcnMNCnByZWRpY3QoaW5jaWRlbnRfbW9kZWwsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKG51bWJlcl9vZl9yYW5nZXJzX2ludm9sdmVkID0gMykpDQoNCiMgY29ycmVsYXRpb24gYmV0d2VlbiB0aW1lIGVsYXBzZWQgYW5kIG51bWJlciBvZiByYW5nZXJzIGZvciBhbGwgdHlwZXMgb2YgaW5jaWRlbnRzDQp5ICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBpbmNpZGVudF90aW1lX2VsYXBzZWQsIHkgPSBudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCwgY29sb3IgPSByZXNwb25zZV90eXBlKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjEpICsNCiAgZmFjZXRfd3JhcCh2YXJzKHJlc3BvbnNlX3R5cGUpKQ0KDQojIGxvb2tpbmcgYXQgY29ycmVsYXRpb24gZm9yIGVhY2ggcmVzcG9uc2UgdHlwZQ0KIyB0aGVyZSBpcyBhIGhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiB0aW1lIGVsYXBzZWQgYW5kIG51bWJlciBvZiByYW5nZXJzIGludm9sdmVkIGZvciBmdWdpdGl2ZSBzZWFyY2gNCiMgdGhlIG90aGVyIG9uZXMgZG9udCBzaG93IGEgaGlnaCBjb3JyZWxhdGlvbiBidXQgdGhpcyBpcyBraW5kYSBleHBlY3RlZCBiZWNhdXNlIHRoZXJlIGFyZSBsb3RzIG9mIG91dGxpZXJzDQp5ICU+JQ0KICBncm91cF9ieShyZXNwb25zZV90eXBlKSAlPiUNCiAgc3VtbWFyaXplKHIgPSBjb3IoaW5jaWRlbnRfdGltZV9lbGFwc2VkLCBudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCwgdXNlID0gImNvbXBsZXRlLm9icyIpKQ0KDQoNCiMgaW5jaWRlbnQgbW9kZWwgcXEgcGxvdA0KcGxvdChpbmNpZGVudF9tb2RlbCkNCg0KYGBgDQoNCg0KDQoNCg0KRm9yIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcywgaW50ZXJwcmV0IGNvZWZmaWNpZW50cyBhbmQvb3IgbWFrZSByZWxldmFudCBwcmVkaWN0aW9ucyBhbmQNCnN1bW1hcml6ZSB0aGVpciBtZWFuaW5nLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KcmF3X2Fka19kYXRhICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3ViamVjdF9hZ2UsIHkgPSBudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCkpKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDMuMTQyNTM1LCBzbG9wZSA9IDAuMDA0NjI3LCBjb2w9Im1hZ2VudGEiKSsNCiAgZ2d0aXRsZSgiUmFuZ2VycyB0byBBZ2UgUmVncmVzc2lvbiIpIA0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpjb3IocmF3X2Fka19kYXRhJHN1YmplY3RfYWdlLHJhd19hZGtfZGF0YSRudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCwgdXNlID0gImNvbXBsZXRlLm9icyIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnggPC0gbG0oZm9ybXVsYSA9IG51bWJlcl9vZl9yYW5nZXJzX2ludm9sdmVkIH4gc3ViamVjdF9hZ2UsZGF0YT1yYXdfYWRrX2RhdGEpDQpzdW1tYXJ5KHgpDQpgYGANCg0KYGBge3J9DQoNCnJhd19hZGtfZGF0YSAlPiUNCiAgZ3JvdXBfYnkocmVzcG9uc2VfdHlwZSkgJT4lDQogIHN1bW1hcml6ZShyID0gY29yKHggPSBzdWJqZWN0X2FnZSwgeSA9IG51bWJlcl9vZl9yYW5nZXJzX2ludm9sdmVkLCB1c2UgPSAiY29tcGxldGUub2JzIikpDQpgYGANCg0KYGBge3J9DQpjb3IocmF3X2Fka19kYXRhJHN1YmplY3RfYWdlLHJhd19hZGtfZGF0YSRudW1iZXJfb2ZfcmFuZ2Vyc19pbnZvbHZlZCwgdXNlID0gImNvbXBsZXRlLm9icyIpDQpgYGANCg0KLi4uDQoNCg0KIyBDb25jbHVzaW9ucw0KDQpXZSB3ZXJlIHVuYWJsZSB0byBmaW5kIGEgZGVtb2dyYXBoaWMgdG8gdGFyZ2V0IHdpdGggYW4gYXdhcmVuZXNzIGNhbXBhaWduIGJlY2F1c2Ugb2YgbG93IHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZS4gRnJvbSBhIGNvbW1vbiBzZW5zZSBzdGFuZHBvaW50IGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gbWFya2V0IG1vcmUgdG8gaGlrZXJzIGJlY2F1c2UgdGhleSBtYWtlIHVwIHRoZSB2YXN0IG1ham9yaXR5IG9mIHRob3NlIGluIG5lZWQgb2YgYXNzaXN0YW5jZSBidXQgc2luY2Ugd2UgZG8gbm90IGhhdmUgZGF0YSBvbiBob3cgbWFueSBwZW9wbGUgcGFydGljaXBhdGUgaW4gZWFjaCBhY3Rpdml0eSwgd2UgY2Fubm90IGRlZmluaXRpdmVseSBzYXkgdGhhdCBoaWtlcnMgbmVlZCBhc3Npc3RhbmNlIGF0IGEgaGlnaGVyIHJhdGUgdGhhbiB0aG9zZSBpbiBvdGhlciBhY3Rpdml0aWVzLiBXZSBjb3VsZCBleHRlbmQgdGhpcyBzdHVkeSB0byB0aGUgcmVzdCBvZiBOZXcgWW9yayBTdGF0ZSBhbmQgZXZlbiB0aGUgcmVzdCBvZiB0aGUgVW5pdGVkIFN0YXRlcywgYnV0IG5vdCBhbGwgcmVnaW9ucyBhcmUgY29tcGFyYWJsZSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdXNhZ2UgYW5kIGNvbW1vbiBhY3Rpdml0aWVzLiBXaGF0IHdvcmtzIGluIG9uZSBhcmVhIG1pZ2h0IG5vdCB3b3JrIGVsc2V3aGVyZS4gDQpPbmUgdGhpbmcgdGhhdCB3b3VsZCBpbXByb3ZlIHRoaXMgc3R1ZHkgaXMgbW9yZSBkYXRhIGFuZCBnZW5lcmFsIHVzYWdlIGRhdGEgdG8gY29tcGFyZSByYXRlcyBvZiBuZWVkZWQgcmVzY3VlIGluIGRpZmZlcmVudCBkZW1vZ3JhcGhpY3MuIFRoZSBkYXRhIG9uIHJlc2N1ZXMgZHVyaW5nIENvdmlkIHdvdWxkIGJlIGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgdG8gbG9vayBhdCBzaW5jZSBtb3JlIHBlb3BsZSBlbmdhZ2VkIHdpdGggdGhlIG91dGRvb3JzLiBTcGVjaWZpY2FsbHkgbW9yZSBpbmV4cGVyaWVuY2VkIHBlb3BsZS4gSXQgd291bGQgYWxzbyBiZSBpbmZvcm1hdGl2ZSB0byBoYXZlIGFub3RoZXIgdmFyaWFibGUgaW4gdGhlIHN0dWR5IHRoYXQgcXVhbGl0YXRpdmVseSByYXRlcyB2aWN0aW0ncyBsZXZlbCBvZiBjb21wZXRlbmNlLiANCi4uLg0KDQoNCiMgUmVmZXJlbmNlcyB7LX0NCg0KRGF0YS53b3JsZA0KaHR0cHM6Ly9kYXRhLndvcmxkL2RhdGEtbnktZ292L3U2aHUtaDdwNQ0K